home *** CD-ROM | disk | FTP | other *** search
- /*
- * $RCSfile: undoBtree.C,v $
- * $Revision: 1.1.1.1 $
- * $Date: 1996/05/04 21:56:03 $
- */
- /**********************************************************************
- * EXODUS Database Toolkit Software
- * Copyright (c) 1991 Computer Sciences Department, University of
- * Wisconsin -- Madison
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
- * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.
- * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
- * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * The EXODUS Project Group requests users of this software to return
- * any improvements or extensions that they make to:
- *
- * EXODUS Project Group
- * c/o David J. DeWitt and Michael J. Carey
- * Computer Sciences Department
- * University of Wisconsin -- Madison
- * Madison, WI 53706
- *
- * or exodus@cs.wisc.edu
- *
- * In addition, the EXODUS Project Group requests that users grant the
- * Computer Sciences Department rights to redistribute these changes.
- **********************************************************************/
- #include "BTREEPAGE.h"
- #include "BT_Log.h"
- #ifdef INIT_LRC_IS_LSN
- # include "log_globals.h"
- #endif
- #include "undo_extfuncs.h"
-
- #ifdef DEBUG
- int undoBtreeTrace = FALSE;
- #undef BT_TRACE
- #define BT_TRACE(x) { if (undoBtreeTrace) printf x; }
-
-
- char* BT_PrintKey(SMDATATYPE type, void* key, int unused)
- {
- static char buf[80];
- switch (type) {
- case SM_char:
- (void) sprintf(buf, "%c", key);
- break;
- case SM_int:
- (void) sprintf(buf, "%d", * (int*) key);
- break;
- case SM_long:
- (void) sprintf(buf, "%d", * (long*) key);
- break;
- case SM_short:
- (void) sprintf(buf, "%d", * (short*) key);
- break;
- case SM_float:
- (void) sprintf(buf, "%f", * (float*) key);
- break;
- case SM_double:
- (void) sprintf(buf, "%f", * (double*) key);
- break;
- case SM_string:
- return (char*) key;
- default:
- return 0;
- }
-
- return buf;
- }
- #else
- #define BT_TRACE(x)
- #endif DEBUG
-
-
-
-
-
- // call the friend separately to avoid g++ bug
- void undoBtree(LOGRECORDHDR* recHdr)
- {
- undoBtree_fr(recHdr);
- }
-
- void undoBtree_fr(LOGRECORDHDR* recHdr)
- {
- #ifdef INIT_LRC_IS_LSN
- LRC tempLRC;
- LRC *lrc = &tempLRC;
- #else
- LRC *lrc;
- #endif /* INIT_LRC_IS_LSN; */
-
- TRPRINT(TR_IO, TR_LEVEL_1, ("lsn:%d", recHdr->recordLSN));
-
- TRANSREC* transRec = (TRANSREC*) Active->transRec;
- INIT_MISSING_UPDATE_INFO(transRec);
- PID* pid = &recHdr->actionPid;
- GROUPLINK* groupLink = bf_ReadPage(UserBufGroup, pid,
- BTREE_PAGE2SIZE, BF_SEM);
- BTREEPAGE* bp = (BTREEPAGE*) groupLink->bufFrame;
- BOOL actionDone = compareLRC( &recHdr->actionLRC, &(bp->lrc())) <= 0;
-
- TRPRINT(TR_IO|TR_LOG, TR_LEVEL_2, ("pid:%d", pid->page));
-
- #ifndef INIT_LRC_IS_LSN
- SM_ASSERT(LEVEL_3, missingUpdateInfo != NULL);
- #endif INIT_LRC_IS_LSN
-
- RECORD_MISSING_UPDATE(actionDone, &lrc, missingUpdateInfo, pid,
- &bp->lrc(), groupLink->pageHash, recHdr, PAGE_INDEX);
-
- if (lrc != & bp->lrc()) GENERATE_LRC(lrc);
-
- LSNOFFSET undoNextLSN = recHdr->previousLSN;
-
- signalSemaphore( & groupLink->pageHash->semaphore);
-
- void* vptr = GET_LOG_IMAGE(recHdr, 0);
- BT_TRACE(("U(%d,%d,%c): ", recHdr->recordLSN.offset, pid->page, actionDone ? 't' : 'f'));
- PAGEHASH* pHash = actionDone ? groupLink->pageHash : 0;
-
- switch (recHdr->action) {
- int i;
-
- case LOG_ACTION_BTREE_MODIFY_LINK:
- {
- LogBtreeModifyLinkData* rp = (LogBtreeModifyLinkData*) vptr;
- BT_TRACE(("modify link\n"));
- if (actionDone) {
- ASSERT3(bp->NextPage() == rp->newNext);
- ASSERT3(bp->PrevPage() == rp->newPrev);
- bp->btCtrl.next = rp->oldNext;
- bp->btCtrl.prev = rp->oldPrev;
- }
- BT_LogModifyLink(bp->SelfID(), pHash, *lrc,
- rp->newNext, rp->oldNext,
- rp->newPrev, rp->oldPrev, undoNextLSN);
- }
- break;
-
- case LOG_ACTION_BTREE_MODIFY_VECTOR0:
- {
- LogBtreeModifyVector0Data* rp = (LogBtreeModifyVector0Data*) vptr;
- BT_TRACE(("modify vec0\n"));
- if (actionDone) {
- ASSERT3(bp->FirstVector() == rp->newPid0);
- bp->SetFirstVector(rp->oldPid0);
- }
- BT_LogModifyVector0(bp->SelfID(), pHash, *lrc,
- rp->newPid0, rp->oldPid0, undoNextLSN);
- }
- break;
-
- case LOG_ACTION_BTREE_MODIFY_LEVEL:
- {
- LogBtreeModifyLevelData* rp = (LogBtreeModifyLevelData*) vptr;
- BT_TRACE(("modify level\n"));
- if (actionDone) {
- ASSERT3(bp->Level() == rp->newLevel);
- bp->SetLevel(rp->oldLevel);
- }
- BT_LogModifyLevel(bp->SelfID(), pHash, *lrc,
- rp->newLevel, rp->oldLevel, undoNextLSN);
- }
- break;
-
- case LOG_ACTION_BTREE_PHYSIC_INSERT:
- {
- LogBtreePhysicInsertData* rp = (LogBtreePhysicInsertData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- BT_TRACE(("physic insert\n"));
- if (actionDone) {
- for (i = rp->startSlot + rp->numSlots - 1;
- i >= rp->startSlot; i--) {
- bp->RemoveTuple(i);
- }
- }
- BT_LogPhysicDelete(bp->SelfID(), pHash, *lrc,
- rp->startSlot, rp->numSlots,
- (int)rp->length, rp->data, undoNextLSN);
- }
- break;
- case LOG_ACTION_BTREE_PHYSIC_DELETE:
- {
- LogBtreePhysicDeleteData* rp = (LogBtreePhysicDeleteData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- BT_TRACE(("physic delete\n"));
- if (actionDone) {
- char* buff = rp->data;
- for (i = rp->startSlot; i < rp->startSlot+rp->numSlots; i++) {
- BT_Tuple* tp = (BT_Tuple*) buff;
- bp->InsertTuple(*tp, i);
- buff += tp->Size();
- }
- ASSERT3(buff - rp->data <= rp->length);
- }
- BT_LogPhysicInsert(bp->SelfID(), pHash, *lrc,
- rp->startSlot, rp->numSlots,
- (int)rp->length, rp->data, undoNextLSN);
- }
- break;
-
- case LOG_ACTION_BTREE_LOGIC_INSERT:
- {
- LogBtreeLogicInsertData* rp = (LogBtreeLogicInsertData*) vptr;
- BT_TRACE(("logic insert %s\n",
- BT_PrintKey(rp->keyType, rp->Key(), rp->keyLen)));
- if (actionDone) {
- if (bt_RemoveEntry(transRec->tid, rp->rootPid, UserBufGroup,
- rp->Key(), rp->keyLen,
- rp->elSize, rp->El(),
- rp->maxKeyLen, rp->unique,
- SMCOMPFUNC[rp->keyType], undoNextLSN)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicDelete(bp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->Key(),
- rp->keyLen, rp->El(),
- rp->elSize,
- rp->maxKeyLen,
- rp->unique, rp->keyType, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_BTREE_LOGIC_DELETE:
- {
- LogBtreeLogicDeleteData* rp = (LogBtreeLogicDeleteData*) vptr;
- BT_TRACE(("logic delete %s\n",
- BT_PrintKey(rp->keyType, rp->Key(), rp->keyLen)));
- if (actionDone) {
- if (bt_InsertEntry(transRec->tid, rp->rootPid, UserBufGroup,
- rp->Key(), rp->keyLen,
- rp->elSize, rp->El(),
- rp->maxKeyLen, rp->unique,
- SMCOMPFUNC[rp->keyType], undoNextLSN)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicInsert(bp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->Key(),
- rp->keyLen, rp->El(), rp->elSize,
- rp->maxKeyLen,
- rp->unique, rp->keyType, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_BTREE_LOGIC_INCR_OIDCNT:
- {
- LogBtreeLogicIncrElCntData* rp =
- (LogBtreeLogicIncrElCntData*) vptr;
- BT_TRACE(("++oidcnt\n"));
- if (actionDone) {
- if (BT_DecrElCnt(transRec->tid, rp->rootPid, UserBufGroup,
- rp->key, rp->keyLen, rp->maxKeyLen,
- SMCOMPFUNC[rp->keyType], undoNextLSN)){
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicDecrElCnt(bp->SelfID(), pHash, *lrc,
- rp->rootPid,
- rp->key, rp->keyLen, rp->maxKeyLen,
- rp->keyType, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_BTREE_LOGIC_DECR_OIDCNT:
- {
- LogBtreeLogicDecrElCntData* rp =
- (LogBtreeLogicDecrElCntData*) vptr;
- BT_TRACE(("--oidcnt\n"));
- if (actionDone) {
- if (BT_IncrElCnt(transRec->tid, rp->rootPid, UserBufGroup,
- rp->key, rp->keyLen, rp->maxKeyLen,
- SMCOMPFUNC[rp->keyType], undoNextLSN)){
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicIncrElCnt(bp->SelfID(), pHash, *lrc,
- rp->rootPid,
- rp->key, rp->keyLen, rp->maxKeyLen,
- rp->keyType, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_BTREE_LOGIC_SET_OVERFLOW:
- {
- LogBtreeLogicSetOverflowData* rp =
- (LogBtreeLogicSetOverflowData*) vptr;
- BT_TRACE(("set overflow\n"));
- if (actionDone) {
- if (BT_ResetOverflow(transRec->tid, rp->rootPid, UserBufGroup,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, SMCOMPFUNC[rp->keyType],
- rp->ElList(), rp->numEl, undoNextLSN)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicResetOverflow(bp->SelfID(), pHash,
- *lrc, rp->rootPid,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, rp->keyType,
- rp->numEl, rp->elSize,
- rp->ElList(), rp->ovPid, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_BTREE_LOGIC_RESET_OVERFLOW:
- {
- LogBtreeLogicResetOverflowData* rp =
- (LogBtreeLogicResetOverflowData*) vptr;
- BT_TRACE(("reset overflow\n"));
- if (actionDone) {
- if (BT_SetOverflow(transRec->tid, rp->rootPid, UserBufGroup,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, SMCOMPFUNC[rp->keyType],
- rp->ElList(), rp->numEl, undoNextLSN)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- BT_LogLogicSetOverflow(bp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->KeyValue(),
- rp->keyLen, rp->maxKeyLen, rp->keyType,
- rp->numEl, rp->elSize,
- rp->ElList(), rp->ovPid, undoNextLSN);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- default:
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
-
- bf_UnfixPage(groupLink, BF_DEFAULT, actionDone);
- }
-
-
-